package shoudongAck;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @program: rabbitmqtest
 * @description:
 * @author: gaoX
 * @create: 2021-07-29 11:35
 **/
public class Receive {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setHost("121.41.192.69");
        factory.setPort(5672);
        //建立到代理服务器到连接
        Connection conn = factory.newConnection();
        //获得信道
        final Channel channel = conn.createChannel();
        /**
         * 声明一个队列。
         * 参数一：队列名称
         * 参数二：是否持久化
         * 参数三：是否排外  如果排外则这个队列只允许有一个消费者
         * 参数四：是否自动删除队列，如果为true表示没有消息也没有消费者连接自动删除队列
         * 参数五：队列的附加属性
         * 注意：
         * 1.声明队列时，如果已经存在则放弃声明，如果不存在则会声明一个新队列；
         * 2.队列名可以任意取值，但需要与消息接收者一致。
         * 3.下面的代码可有可无，一定在发送消息前确认队列名称已经存在RabbitMQ中，否则消息会发送失败。
         */
        channel.queueDeclare("Queue_shoudong", true, false, false, null);
        //接收消息
        //参数1 队列名称
        //参数2 是否自动确认消息 true表示自动确认 false表示手动确认
        //参数3 为消息标签 用来区分不同的消费者这里暂时为""
        // 参数4 消费者回调方法用于编写处理消息的具体代码（例如打印或将消息写入数据库）
        channel.basicConsume("Queue_shoudong", false, "", new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                //获取消息数据
                String bodyStr = new String(body, "UTF-8");
                System.out.println(bodyStr);
//                int i=0;
//                if(i==0){
//                    channel.basicAck(envelope.getDeliveryTag(),false);
//                }

            }
        });
//            channel.close();
//            conn.close();
    }
}
